package com.liqi.system.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.liqi.common.constant.RedisConstants;
import com.liqi.common.core.redis.RedisCache;
import com.liqi.common.utils.DateUtils;
import com.liqi.system.domain.SysRegion;
import com.liqi.system.domain.dto.RegionDto;
import com.liqi.system.domain.vo.SysRegionVo;
import com.liqi.system.mapper.SysRegionMapper;
import com.liqi.system.service.ISysRegionService;

/**
 * 行政区域管理Service业务层处理
 *
 * @author ymh
 * @date 2022-02-21
 */
@Service
public class SysRegionServiceImpl implements ISysRegionService {

	private static final Logger logger = LoggerFactory.getLogger(SysRegionServiceImpl.class);
	
	@Autowired
	private SysRegionMapper sysRegionMapper;

	@Autowired
	private RedisCache redisCache;

	@Override
	public List<SysRegion> selectSysRegionListByParentId(Long parentId) {
		return sysRegionMapper.selectSysRegionListByParentId(parentId);
	}

	//查询多级省市信息
	@Override
	public Map findRegionTreeByPid(Long parentId){
		Map<String, List<SysRegion>> map = new HashMap<>();
		List<SysRegion> list = selectSysRegionListByParentId(parentId);
		String id = Long.toString(parentId);
		map.put(id, list);
		//调用递归，查询所有下级
		//findRegionDigui(list, map);
		return map;
	}

	public void findRegionDigui(List<SysRegion> regions, Map<String, List<SysRegion>> map) {
		List<SysRegion> reList = new ArrayList<>();
		for (SysRegion r : regions) {
			//通过ID查询下一级
			reList = selectSysRegionListByParentId(Long.parseLong(r.getId()));
			if (reList.size() > 0) {//代表有下级
				map.put(r.getId(), reList);
				findRegionDigui(reList, map); //循环调用自己
			}
		}
	}

	/**
	 * 查询行政区域管理
	 *
	 * @param id 行政区域管理主键
	 * @return 行政区域管理
	 */
	@Override
	public SysRegion selectSysRegionById(String id) {
		return sysRegionMapper.selectSysRegionById(id);
	}

	/**
	 * 查询行政区域管理列表
	 *
	 * @param sysRegion 行政区域管理
	 * @return 行政区域管理
	 */
	@Override
	public List<SysRegion> selectSysRegionList(SysRegion sysRegion) {
		return sysRegionMapper.selectSysRegionList(sysRegion);
	}

	/**
	 * 新增行政区域管理
	 *
	 * @param sysRegion 行政区域管理
	 * @return 结果
	 */
	@Override
	public int insertSysRegion(SysRegion sysRegion) {
		sysRegion.setCreateTime(DateUtils.getNowDate());
		int num = sysRegionMapper.insertSysRegion(sysRegion);

		// 增删改刷新缓存
		SysRegionVo sysRegionVo = new SysRegionVo();
		refreshAllRegionCache(sysRegionVo);
		return num;
	}

	/**
	 * 修改行政区域管理
	 *
	 * @param sysRegion 行政区域管理
	 * @return 结果
	 */
	@Override
	public int updateSysRegion(SysRegion sysRegion) {
		sysRegion.setUpdateTime(DateUtils.getNowDate());
		int num = sysRegionMapper.updateSysRegion(sysRegion);
		// 增删改刷新缓存
		SysRegionVo sysRegionVo = new SysRegionVo();
		refreshAllRegionCache(sysRegionVo);

		return num;
	}

	/**
	 * 批量删除行政区域管理
	 *
	 * @param ids 需要删除的行政区域管理主键
	 * @return 结果
	 */
	@Override
	public int deleteSysRegionByIds(String[] ids) {
		int num = sysRegionMapper.deleteSysRegionByIds(ids);
		// 增删改刷新缓存
		SysRegionVo sysRegionVo = new SysRegionVo();
		refreshAllRegionCache(sysRegionVo);
		return num;
	}

	/**
	 * 删除行政区域管理信息
	 *
	 * @param id 行政区域管理主键
	 * @return 结果
	 */
	@Override
	public int deleteSysRegionById(String id) {
		int num = sysRegionMapper.deleteSysRegionById(id);
		// 增删改刷新缓存
		SysRegionVo sysRegionVo = new SysRegionVo();
		refreshAllRegionCache(sysRegionVo);
		return num;
	}

	/**
	 * 页面上查询所有区域，作为下拉选择对应的选择框
	 */
	@Override
	public List<SysRegionVo> selectSysRegionData(SysRegionVo sysRegionVo) {
		List<SysRegionVo> list = redisCache.getCacheObject(RedisConstants.SYS_REGION_ALL_KEY);
		if (list == null || list.size() < 1) {
			list = refreshAllRegionCache(sysRegionVo);
		}
		return list;
	}

	@Override
	public List<SysRegionVo> selectSysRegionLevel2() {
		return sysRegionMapper.selectSysRegionLevel2();
	}

	@Override
	public List<RegionDto> getRegionlist(Long parentId) {
		return sysRegionMapper.getRegionlist(parentId);
	}

	private List<SysRegionVo> refreshAllRegionCache(SysRegionVo sysRegionVo) {
		logger.info("refreshAllRegionCache重新获取所有区域数据更新缓存");
		List<SysRegionVo> list = sysRegionMapper.selectSysRegionData(sysRegionVo);
		redisCache.setCacheObject(RedisConstants.SYS_REGION_ALL_KEY, list, 8, TimeUnit.HOURS);
		return list;
	}
}
